//package cn.kgm.generator.controller;
//
//import cn.kgm.generator.utils.DateUtils;
//import cn.kgm.generator.utils.GenR;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.annotation.Resource;
//import java.util.Date;
//import java.util.concurrent.TimeUnit;
//
///**
// * @Version 1.8
// * @Author: Kappi
// * @Date: 2024-3-21 12:45
// * @Description: cn.kgm.generator.controller.LockTestController
// */
//@RestController
//@RequestMapping("/lock")
//public class LockTestController {
//
//    private static final String LOCK_KEY = "LOCK_KEY";
//
//    @Resource
//    private RedissonClient redissonClient;
//
//    @GetMapping
//    public GenR lock() {
//        RLock lock = redissonClient.getLock(LOCK_KEY);
//        try {
//            /**
//             * 两个线程争抢同一把锁
//             * 如果第一个线程拿到了锁，第二个线程设置:
//             * lock.tryLock(5L, TimeUnit.SECONDS)
//             * 看似等待五秒钟后返回false，其实不然
//             * 因为redisson锁内部有个【锁持有时间】机制
//             * 如果A线程获取到了B线程想要获取的锁，此时B线程再来获取锁
//             * 因为有人拿到锁,所以就会在A线程的【锁持有时间】内等待
//             * 这个时间默认是30S，也就是说B线程大约要等30S才会返回false
//             *
//             * 这里的第二个参数【10】代表的是此线程的【锁持有时间】
//             * lock.tryLock(5L,10, TimeUnit.SECONDS)
//             */
//            if (lock.tryLock(5L, TimeUnit.SECONDS)) {
//                System.out.println("锁定时间，" + DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN) + "线程名" + Thread.currentThread().getName() + Thread.currentThread().getId());
//                Thread.sleep(150000);
//            } else {
//                System.out.println("放弃锁时间，" + DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN) + "线程名" + Thread.currentThread().getName() + Thread.currentThread().getId());
//            }
//        } catch (Exception e) {
//            System.out.println("这个线程异常捕获" + Thread.currentThread().getName());
//        } finally {
//            try {
//                lock.unlock();
//                System.out.println("这里是final中的线程释放" + Thread.currentThread().getName());
//            } catch (Exception e) {
//                System.out.println("锁释放失败" + Thread.currentThread().getName());
//            }
//        }
//        return GenR.ok();
//    }
//}
